package com.web.util;


import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * <p>
 * 文件上传
 * </p>
 * ***********************************************
 * BECAUSE OF CHOICE, STICK TO IT.               *
 * ***********************************************
 *
 * @author Yang@Jowim.com
 * @version V1.0
 * @date 2018年10月20日 17:09
 * @see Copyright (c) 2018 泉州卓旻网络科技有限公司
 */
public class UploadFile {

    /**
     * 传入进来，获取原文件的名称路径
     */
    private static final String INPUT_FILE = "inputFile";
    /**
     * 传出去，新的文件的名称（图片可用于直接拼接ip+端口号，已经处理反斜杠）
     */
    private static final String OUTPUT_FILE = "outputFile";
    /**
     * 储存绝对路径
     */
    private static final String FILE = "file";


    /**
     * 文件上传
     *
     * @param picture    流
     * @param request    http
     * @param folderName 文件夹名称
     * @param flag       是否在文件夹里根据日期“yyyyMMdd”分类 20181020
     * @return map ："inputFile"原文件名称  "inputFile"新文件路径（图片可用于直接拼接ip+端口号，已经处理反斜杠）  "inputFile"绝对路径
     */
    public static Map<String, String> uploadSingle(MultipartFile picture, HttpServletRequest request, String folderName, boolean flag) {
        Map<String, String> map = new HashMap<>();
        if (!picture.isEmpty()) {
            try {
                String outputFile = folderName;
                //获取存放路径
                File file = new File(new File(request.getSession().getServletContext().getRealPath("/")).getParent(), folderName);
                // 判断文件夹是否存在
                if (!file.exists()) {
                    // 不存在则创建
                    file.mkdir();
                }
                if (flag) {
                    //获取系统日期
                    String date = new Date(System.currentTimeMillis()).toString();
                    file = new File(file, date);
                    // 判断文件夹是否存在
                    if (!file.exists()) {
                        // 不存在则创建
                        file.mkdir();
                    }
                    outputFile = new File(folderName, date).toString();
                }
                // 生成新的名称
                String newName = UUID.randomUUID().toString();
                // 获取原文件的名称
                String oldName = picture.getOriginalFilename();
                // 新名称加上截取的后缀名
                String newFileName = newName + "." + oldName.substring(oldName.lastIndexOf(".") + 1);
                // 保存到路径下的文件夹
                File newFile = new File(file, newFileName);
                if (!newFile.exists()) {
                    newFile.createNewFile();
                    picture.transferTo(newFile);
                    if (newFile.exists()) {
                        System.out.println("" + newFile);
                        map.put(INPUT_FILE, picture.getOriginalFilename());
                        map.put(OUTPUT_FILE, new File(outputFile, newFile.getName()).toString().replaceAll("\\\\", "/"));
                        map.put(FILE, newFile.toString());
                        return map;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                return map;
            }
        }
        return map;
    }

    /**
     * 将图片从缓存移动到正式 半路径
     *
     * @param picture       图片缓存地址
     * @param photoFileName 图片正式存放文件夹名称
     * @return
     */
    public static String addImgofficialUpload(String picture, String photoFileName, HttpServletRequest request)throws ServiceException {
        // 提取出图片名称
        String img = picture.split(FileImgMessage.SUFFIX)[1];
        // 生成公共地址
        String fileString = (new File(request.getSession().getServletContext().getRealPath("/"))).getParent();
        File file = new File(fileString);
        System.out.println(file);
        // 生成缓存地址
        File oldFile = new File(file, picture);
        // 生成最终广告图片存放地址
        File newFile = new File(file + photoFileName, img);
        if (!newFile.getParentFile().getParentFile().exists()) {
            newFile.getParentFile().getParentFile().mkdir();
        }
        if (!newFile.getParentFile().exists()) {
            newFile.getParentFile().mkdir();
        }
        if (oldFile.exists()) {
            try {
                //TODO 文件系统不一致会导致此处renameTo抛异常
                //oldFile.renameTo(newFile);
                Path p1 = oldFile.toPath();
                Path p2 = newFile.toPath();
                Files.move(oldFile.toPath(), newFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
                //Files.delete(oldFile.toPath());
                if (newFile.exists()) {
                    //boolean deleteFile = deleteFile(oldFile);
                    String URL = photoFileName + FileImgMessage.SUFFIX + img;
                    return URL;
                }
                throw new ServiceException("移动文件失败");
            } catch (Exception e) {
                e.printStackTrace();
                throw new ServiceException("未成功移动文件");
            }
        }
        throw new ServiceException("移动失败，未找到上传的文件");
    }

    /**
     * 删除文件
     *
     * @param file 文件地址
     * @return
     */
    private static boolean deleteFile(File file) {
        try {
            if (file.exists()) { // 这里判断文件是否存在
                file.delete();
                return true;
            } else {// 如果不存在
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }
}

interface FileImgMessage {
    //文件夹
    String SUFFIX = "/";
    //失败回传
    String RESULT_FAILED = "FAILED";
}